#include "Head.h"

// 读取航班信息到文件中
void File_Printf_Flight(Flight_Head_Node *Head)
{
    // 打开文件 覆盖写模式 如果没有文件创建文件
    fp_flight = fopen(FLIGHTS_FILE, "w");

    // 安全判断
    if (fp_flight == NULL)
    {
        ERRLOG("文件未打开");
        return;
    }

    // 安全判断
    if (Head == NULL)
    {
        ERRLOG("双向循环链表为NULL");

        // 关闭文件
        fclose(fp_flight);
        return;
    }
    if (Head->next == NULL)
    {
        ERRLOG("双向循环链表为空");

        // 关闭文件
        fclose(fp_flight);

        // 链表没数据 则直接返回
        return;
    }

    // 将文件光标移动到开头
    fseek(fp_flight, 0, SEEK_SET);

    // 将数据读取到文件中
    Flight_Node *ptr = Head->next;
    do
    {
        fprintf(fp_flight, "%d\t\t%s\t\t%s\t\t%s\t\t%d : %d\t\t%d : %d\t\t%-10s\t\t\t%d\t\t%d\t\t%d\t\t%c\n",
                /*航班                  飞机机型                 航班起点站                    航班终点站*/
                ptr->data.id, ptr->data.flighttype, ptr->data.startcity, ptr->data.arrivecity,
                /*起飞时间 时            起飞时间 分              到达时间 时                   到达时间 分*/
                ptr->data.starttime[0], ptr->data.starttime[1], ptr->data.arrivetime[0], ptr->data.arrivetime[1],
                /*飞行时间               票价                    额定载客量                    剩余座位数*/
                ptr->data.flytime, ptr->data.value, ptr->data.maxNUM, ptr->data.leftbuyersa,
                /*是否起飞*/
                ptr->data.whetherfly);
        ptr = ptr->next;
    } while (ptr != Head->next);

    // 关闭文件
    fclose(fp_flight);
    return;
}

// 从文件中读取航班信息
void File_Scanf_Flight(Flight_Head_Node *Head)
{
    // 打开文件 只读模式
    fp_flight = fopen(FLIGHTS_FILE, "r");

    // 安全判断
    if (fp_flight == NULL)
    {
        ERRLOG("文件未打开");
        return;
    }

    // 读取前将链表清空
    Empty_dlist(Head);

    // 从文件中读取数据 写入到链表中
    {
        // 判断文件有几行 控制循环次数

        // 将文件光标移动到开头
        fseek(fp_flight, 0, SEEK_SET);

        char ch;      // 用于接收从文件中读取的字符 进行判断
        int line = 0; // 记录文件行数
        for (size_t i = 0; EOF != (ch = fgetc(fp_flight)); i++)
        {
            if (ch == '\n')
            {
                line++;
            }
        }

        Flight_data data; // 用于接受文件中的航班信息

        // 将文件光标移动到开头
        fseek(fp_flight, 0, SEEK_SET);

        // 循环将文件中数据一行行读取到链表中
        size_t i;
        for (i = 0; i < line; i++)
        {
            fscanf(fp_flight, "%d\t\t%s\t\t%s\t\t%s\t\t%d : %d\t\t%d : %d\t\t%s\t\t%d\t\t%d\t\t%d\t\t%c\n",
                   /*航班                  飞机机型                 航班起点站                    航班终点站*/
                   &data.id, data.flighttype, data.startcity, data.arrivecity,
                   /*起飞时间 时            起飞时间 分              到达时间 时                   到达时间 分*/
                   &data.starttime[0], &data.starttime[1], &data.arrivetime[0], &data.arrivetime[1],
                   /*飞行时间               票价                    额定载客量                    剩余座位数*/
                   data.flytime, &data.value, &data.maxNUM, &data.leftbuyersa,
                   /*是否起飞*/
                   &data.whetherfly);

            // 将数据插入到链表中
            Insert_dlist(Head, data, i + 1);
        }
    }

    // 关闭文件
    fclose(fp_flight);

    return;
}

// 读取 单链表中的 用户信息 到文件中
void File_Printf_User(User_Head_Node *Head, const char *file_name)
{
    // 打开文件 覆盖写模式 如果没有文件创建文件
    fp_user = fopen(file_name, "w");

    // 安全判断
    if (fp_user == NULL)
    {
        ERRLOG("文件未打开");
        return;
    }

    // 安全判断
    if (Head == NULL)
    {
        ERRLOG("单链表为NULL");

        // 关闭文件
        fclose(fp_user);
        return;
    }
    if (Head->next == NULL)
    {
        ERRLOG("单链表为空");

        // 关闭文件
        fclose(fp_user);

        // 链表没数据 则直接返回
        return;
    }

    // 将文件光标移动到开头
    fseek(fp_user, 0, SEEK_SET);

    // 将数据读取到文件中
    User_Node *ptr = Head->next;

    for (size_t j = 0; ptr != NULL; j++)
    {
        fprintf(fp_user, "%s\t%s\t\t%d\t%s\n", ptr->data.user, ptr->data.pas, ptr->data.balance, ptr->data.Account_level);

        // 读取用户 航班订单信息
        for (size_t i = 0; i < ptr->data.Order->len; i++)
        {
            fprintf(fp_user, "%d\t\t%s\t\t%s\t\t%s\t\t%d : %d\t\t%d : %d\t\t%-10s\t\t\t%d\t\t%d\t\t%d\t\t%c\t\\\t",
                    /*航班                                                  飞机机型*/
                    ptr->data.Order->Order_Data[i].id, ptr->data.Order->Order_Data[i].flighttype,
                    /*航班起点站                                            航班终点站*/
                    ptr->data.Order->Order_Data[i].startcity, ptr->data.Order->Order_Data[i].arrivecity,
                    /*起飞时间 时                                           起飞时间 分*/
                    ptr->data.Order->Order_Data[i].starttime[0], ptr->data.Order->Order_Data[i].starttime[1],
                    /*到达时间 时                                           到达时间 分*/
                    ptr->data.Order->Order_Data[i].arrivetime[0], ptr->data.Order->Order_Data[i].arrivetime[1],
                    /*飞行时间                                              票价*/
                    ptr->data.Order->Order_Data[i].flytime, ptr->data.Order->Order_Data[i].value,
                    /*额定载客量                                            剩余座位数*/
                    ptr->data.Order->Order_Data[i].maxNUM, ptr->data.Order->Order_Data[i].leftbuyersa,
                    /*是否起飞*/
                    ptr->data.Order->Order_Data[i].whetherfly);
            if (i == ptr->data.Order->len - 1)
            {
                fprintf(fp_user, "\r");
            }
        }
        if (ptr->data.Order->len == 0) //
        {
            fprintf(fp_user, "\r");
        }

        ptr = ptr->next;
    }

    // 关闭文件
    fclose(fp_user);
    return;
}

// 从文件中 读取 用户信息 到单链表中
void File_Scanf_User(User_Head_Node *Head, const char *file_name)
{
    // 打开文件 只读模式
    fp_user = fopen(file_name, "r");

    // 安全判断
    if (fp_user == NULL)
    {
        ERRLOG("文件未打开");
        return;
    }

    // 从文件中读取数据 写入到链表中
    {
        // 判断文件有几行 控制循环次数

        // 将文件光标移动到开头
        fseek(fp_user, 0, SEEK_SET);

        char ch;      // 用于接收从文件中读取的字符 进行判断
        int line = 0; // 记录文件行数
        for (size_t i = 0; EOF != (ch = fgetc(fp_user)); i++)
        {
            if (ch == '\r')
            {
                line++;
            }
        }
        // printf("line = %d\n" , line);

        // 用数组储存 每个用户航班订单 的个数
        int Line[50] = {0};
        fseek(fp_user, 0, SEEK_SET);
        int i;
        int j = 0;
        for (i = 0; EOF != (ch = fgetc(fp_user));)
        {
            if (ch == '\\')
            {
                i++; // 读到 \ 代表航班数加一
            }
            if (ch == '\r') // 读到\r代表 该用户数据全部读取完
            {
                Line[j] = i;
                // printf("第%d个用户的航班数为%d\n",j+1,Line[j]);
                i = 0;
                j++;
            }
        }

        // printf("用户数%d\n", line);

        User_data data; // 用于接受文件中的航班信息
        // memset(&data , 0 , 1);
        Flight_data data_f; // 用于接收文件中的 用户航班订单信息
        // memset(&data_f , 0 , 1);

        // 将文件光标移动到开头
        fseek(fp_user, 0, SEEK_SET);

        // 读取前将链表清空
        Empty_List(Head);

        // 循环将文件中数据一行行读取到链表中
        for (size_t i = 0; i < line; i++) // 第i个用户
        {
            fscanf(fp_user, "%s\t%s\t\t%d\t%s\n", data.user, data.pas, &data.balance, data.Account_level);

            // 将数据插入到链表中
            Insert_List(Head, data, i + 1);

            // 读取用户 航班订单信息
            for (size_t j = 0; j < Line[i]; j++)
            {
                fscanf(fp_user, "%d\t\t%s\t\t%s\t\t%s\t\t%d : %d\t\t%d : %d\t\t%s\t\t\t%d\t\t%d\t\t%d\t\t%c\t\\\t",
                       /*航班                                                  飞机机型*/
                       &data_f.id, data_f.flighttype,
                       /*航班起点站                                            航班终点站*/
                       data_f.startcity, data_f.arrivecity,
                       /*起飞时间 时                                           起飞时间 分*/
                       &data_f.starttime[0], &data_f.starttime[1],
                       /*到达时间 时                                           到达时间 分*/
                       &data_f.arrivetime[0], &data_f.arrivetime[1],
                       /*飞行时间                                              票价*/
                       data_f.flytime, &data_f.value,
                       /*额定载客量                                            剩余座位数*/
                       &data_f.maxNUM, &data_f.leftbuyersa,
                       /*是否起飞*/
                       &data_f.whetherfly);

                User_Node *ptr = Find_By_Name(Head, data.user);
                // 将用户航班订单数据插入到顺序表中
                Insert_Sql_list(ptr->data.Order, data_f);
            }
        }
    }

    // 关闭文件
    fclose(fp_user);

    return;
}

// 进度条
void Progress_bar()
{
    char ch[MAX];
    char symbol[] = {'|', '\\', '-', '/'};
    char against_symbol[] = {'|', '/', '-', '\\'};
    int time = 2;
    int i;
    memset(ch, 0, sizeof(ch));
    system("clear");
    for (i = 0; i < 100; i++)
    {
        printf("\33[42;37m[%-100s] %d%% %c %c\33[0m\r", ch, i, symbol[i % 4], against_symbol[i % 4]);
        ch[i] = '>';
        fflush(stdout);
        usleep(10000 * time); // 0.01s
    }
    system("clear");
}

// 隐藏密码
char *Conceal_Pas(char *in_pas)
{
    int i = 0;
    system("stty -icanon"); // 设置一次性读完操作，即getchar()不用回车也能获取字符
    system("stty -echo");   // 关闭回显，即输入任何字符都不显示
    while (i < 10)
    {
        in_pas[i] = getchar();          // 获取键盘的值到数组中
        if (i == 0 && in_pas[i] == 127) // Ascll 127 为删除
        {
            i = 0; // 若开始没有值，输入删除，则，不算值
            in_pas[i] = '\0';
            continue;
        }
        else if (in_pas[i] == 127)
        {
            printf("\b \b"); // 若删除，则光标前移，输空格覆盖，再光标前移
            in_pas[i] = '\0';
            i = i - 1; // 返回到前一个值继续输入
            continue;  // 结束当前循环
        }
        else if (in_pas[i] == '\n') // 若按回车则，输入结束
        {
            in_pas[i] = '\0';
            break;
        }
        else
        {
            printf("*");
        }
        i++;
    }
    system("stty echo");   // 开启回显
    system("stty icanon"); // 关闭一次性读完操作，即getchar()必须回车也能获取字符

    return in_pas;
}

// 小飞机
void plane()
{
    system("clear");
    printf("\033[1;96;5m");
    for (size_t i = 0; i < 20; i++)
    {
        printf("\n");
    }
    printf("                                 /\\\n");
    printf("                                /**\\\n");
    fflush(stdout);
    usleep(150000);
    system("clear");
    for (size_t i = 0; i < 18; i++)
    {
        printf("\n");
    }
    printf("                                 /\\\n");
    printf("                                /**\\\n");
    printf("                               /****\\\n");
    printf("                              /口**口\\\n");
    fflush(stdout);
    usleep(150000);
    system("clear");
    for (size_t i = 0; i < 16; i++)
    {
        printf("\n");
    }
    printf("                                 /\\\n");
    printf("                                /**\\\n");
    printf("                               /****\\\n");
    printf("                              /口**口\\\n");
    printf("                              **————**\n");
    printf("                              **    **\n");
    fflush(stdout);
    usleep(150000);
    system("clear");
    for (size_t i = 0; i < 14; i++)
    {
        printf("\n");
    }
    printf("                                 /\\\n");
    printf("                                /**\\\n");
    printf("                               /****\\\n");
    printf("                              /口**口\\\n");
    printf("                              **————**\n");
    printf("                              **    **\n");
    printf("                              ** 中 **\n");
    printf("                              ** 华 **\n");
    fflush(stdout);
    usleep(150000);
    system("clear");
    for (size_t i = 0; i < 12; i++)
    {
        printf("\n");
    }
    printf("                                 /\\\n");
    printf("                                /**\\\n");
    printf("                               /****\\\n");
    printf("                              /口**口\\\n");
    printf("                              **————**\n");
    printf("                              **    **\n");
    printf("                              ** 中 **\n");
    printf("                              ** 华 **\n");
    printf("                              **    **\n");
    printf("                             *** 民 ***\n");
    fflush(stdout);
    usleep(150000);
    system("clear");
    for (size_t i = 0; i < 10; i++)
    {
        printf("\n");
    }
    printf("                                 /\\\n");
    printf("                                /**\\\n");
    printf("                               /****\\\n");
    printf("                              /口**口\\\n");
    printf("                              **————**\n");
    printf("                              **    **\n");
    printf("                              ** 中 **\n");
    printf("                              ** 华 **\n");
    printf("                              **    **\n");
    printf("                             *** 民 ***\n");
    printf("                         ******* 航 *******\n");
    printf("                      **********    **********\n");
    fflush(stdout);
    usleep(150000);
    system("clear");
    for (size_t i = 0; i < 8; i++)
    {
        printf("\n");
    }
    printf("                                 /\\\n");
    printf("                                /**\\\n");
    printf("                               /****\\\n");
    printf("                              /口**口\\\n");
    printf("                              **————**\n");
    printf("                              **    **\n");
    printf("                              ** 中 **\n");
    printf("                              ** 华 **\n");
    printf("                              **    **\n");
    printf("                             *** 民 ***\n");
    printf("                         ******* 航 *******\n");
    printf("                      **********    **********\n");
    printf("                 *************** 欢 ***************\n");
    printf("           ********************* 迎 *********************\n");
    fflush(stdout);
    usleep(150000);
    system("clear");
    for (size_t i = 0; i < 6; i++)
    {
        printf("\n");
    }
    printf("                                 /\\\n");
    printf("                                /**\\\n");
    printf("                               /****\\\n");
    printf("                              /口**口\\\n");
    printf("                              **————**\n");
    printf("                              **    **\n");
    printf("                              ** 中 **\n");
    printf("                              ** 华 **\n");
    printf("                              **    **\n");
    printf("                             *** 民 ***\n");
    printf("                         ******* 航 *******\n");
    printf("                      **********    **********\n");
    printf("                 *************** 欢 ***************\n");
    printf("           ********************* 迎 *********************\n");
    printf("      ********************/   **    **   \\********************\n");
    printf("                              ** 您 **\n");

    fflush(stdout);
    usleep(150000);
    system("clear");
    for (size_t i = 0; i < 4; i++)
    {
        printf("\n");
    }
    printf("                                 /\\\n");
    printf("                                /**\\\n");
    printf("                               /****\\\n");
    printf("                              /口**口\\\n");
    printf("                              **————**\n");
    printf("                              **    **\n");
    printf("                              ** 中 **\n");
    printf("                              ** 华 **\n");
    printf("                              **    **\n");
    printf("                             *** 民 ***\n");
    printf("                         ******* 航 *******\n");
    printf("                      **********    **********\n");
    printf("                 *************** 欢 ***************\n");
    printf("           ********************* 迎 *********************\n");
    printf("      ********************/   **    **   \\********************\n");
    printf("                              ** 您 **\n");
    printf("                              **    **\n");
    printf("                              ** ** **\n");

    fflush(stdout);
    usleep(150000);
    system("clear");
    for (size_t i = 0; i < 2; i++)
    {
        printf("\n");
    }
    printf("                                 /\\\n");
    printf("                                /**\\\n");
    printf("                               /****\\\n");
    printf("                              /口**口\\\n");
    printf("                              **————**\n");
    printf("                              **    **\n");
    printf("                              ** 中 **\n");
    printf("                              ** 华 **\n");
    printf("                              **    **\n");
    printf("                             *** 民 ***\n");
    printf("                         ******* 航 *******\n");
    printf("                      **********    **********\n");
    printf("                 *************** 欢 ***************\n");
    printf("           ********************* 迎 *********************\n");
    printf("      ********************/   **    **   \\********************\n");
    printf("                              ** 您 **\n");
    printf("                              **    **\n");
    printf("                              ** ** **\n");
    printf("                            ************\n");
    printf("                        ********************\n");

    fflush(stdout);
    usleep(150000);
    system("clear");
    printf("                                 /\\\n");
    printf("                                /**\\\n");
    printf("                               /****\\\n");
    printf("                              /口**口\\\n");
    printf("                              **————**\n");
    printf("                              **    **\n");
    printf("                              ** 中 **\n");
    printf("                              ** 华 **\n");
    printf("                              **    **\n");
    printf("                             *** 民 ***\n");
    printf("                         ******* 航 *******\n");
    printf("                      **********    **********\n");
    printf("                 *************** 欢 ***************\n");
    printf("           ********************* 迎 *********************\n");
    printf("      ********************/   **    **   \\********************\n");
    printf("                              ** 您 **\n");
    printf("                              **    **\n");
    printf("                              ** ** **\n");
    printf("                            ************\n");
    printf("                        ********************\n");
    printf("                     **********/    \\**********\n");
    printf("                   ————————————      ————————————\n");
    fflush(stdout);
    usleep(100000);
    system("clear");
    printf("\033[0m");
}
